package com.atguigu.b_abstract;

public class Demo {
    public static void main(String[] args) {
        //创建子类对象
        Dog dog = new Dog();
        Cat cat = new Cat();
        //Pig pig = new Pig();

        dog.eat();
        cat.eat();
        //pig.eat();
    }
}

//继承 : 向上抽取共性
//为什么代码变麻烦了,还要求这样做 : 父类约束子类问题
abstract class Animal{
    //如果父类的方法的完成方式满足不了子类的需求,子类需要重写父类中的方法
    public abstract void eat(); //抽象方法 : 没有方法体 还需要被 abstract 修饰
    //抽象方法必须存在于抽象类/接口中 : 把类也用抽象修饰
}

//普通父类中的行为 子类们是选择性重写 没有语法上的要求
//抽象父类中的抽象方法[抽象行为] 要求子类们必须重写  有语法上的要求
class Dog extends Animal{
    @Override
    public void eat() {
        System.out.println("狗吃骨头 ! ");
    }
}

class Cat extends Animal{
    @Override
    public void eat() {
        System.out.println("猫吃罐头 ! ");
    }
}

abstract class Pig extends Animal{

}

class Tiger extends Animal{

    @Override
    public void eat() { //空实现
        //实现父类中的抽象方法
    }
}